Reflected XSS into attribute with angle brackets HTML-encoded
Bypass de HTML-encoding de angle brackets dentro de un atributo: cerrar la comilla e inyectar autofocus onfocus ejecuta alert(document.domain) sin usar < ni >.
Target Overview & Vulnerability Summary
El laboratorio contexts/lab-attribute-angle-brackets-html-encoded contiene un XSS reflejado en la búsqueda del blog donde los angle brackets están HTML-encoded. La reflexión ocurre dentro de un atributo: el contexto de escape es la comilla doble y la inyección de atributos/eventos, no el markup.
| Campo | Valor |
|---|---|
| Severidad | Media-Alta (ejecución de JavaScript en el contexto de la víctima) |
| Endpoint vulnerable | / (parámetro search) |
| Root cause | HTML-encoding de angle brackets sin escape de comillas en un contexto de atributo |
Technical Breakdown & Exploitation Flow
1. Confirmación del contexto de reflexión
GET /?search=a HTTP/2
Host: <LAB-ID>.web-security-academy.net
La respuesta refleja el valor dentro de un atributo value o similar, con los angle brackets codificados (< pasa a <). En este lab la reflexión queda en un contexto de atributo HTML:
<section class=blog-header>
<h1>0 search results for 'a'</h1>
<hr>
</section>
2. Payload de inyección de atributo
Los angle brackets no se pueden usar (están HTML-encoded), pero las comillas dobles no se escapan. El payload cierra el atributo con " e inyecta un nuevo atributo autofocus + handler onfocus:
" autofocus onfocus=alert(document.domain) closeme="
Reflejado:
<section class=blog-header>
<h1>0 search results for '" autofocus onfocus=alert(document.domain) closeme="'</h1>
<hr>
</section>
autofocus— enfoca el elemento automáticamente al cargar, sin interacción del usuario.onfocus=alert(document.domain)— el handler de evento se dispara al enfocar.closeme="— re-abre una comilla para neutralizar la comilla de cierre del atributo original (mantiene balanceado el markup).
3. Variante con pseudo-protocolo
Cuando el contexto lo permite (p. ej. dentro de un href o src), el esquema javascript: también ejecuta:
javascript:alert(1)
En este lab la vía funcional es la inyección de atributos con autofocus onfocus.
Root Cause Analysis
La codificación de </> protege únicamente contra la inyección de tags. Dentro de un atributo delimitado por comillas dobles, el carácter peligroso es la comilla: si no se escapa, el atacante cierra el atributo e introduce atributos arbitrarios (event handlers). La defensa implementada no cubre el contexto real de salida — otra instancia de escaping al contexto equivocado. autofocus onfocus es el patrón estándar para explotar este contexto sin interacción.
Secure Remediation
- Escapar según el contexto de atributo: codificar
&,",<,>y'. Con"el payload" autofocus...quedaría neutralizado. - Usar las plantillas seguras del framework (escapado automático de contexto, p. ej.
{% autoescape %}/ utilidades equivalentes) en lugar de concatenación manual. - Si se necesita salida en atributo, aplicar
encodeURIComponent/attribute-encoding y evitar interpolar handlers de evento derivados de input del usuario. Añadir CSPscript-srcestricto como capa final.